//
//  LWEmoticonTools.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/20.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

//每页最多20个表情数据
let numbersOfPage = 20

//处理bundle包的工具类 读取Emoticons.bundle中的表情数据
class LWEmoticonTools: NSObject {
    
    //定义全局的单例
    static let sharedEmoticonTools = LWEmoticonTools()
    
    
    //私有化init方法 让外界不能用init来创建这个工具对象
    private override init() {
        
        super.init()
        
    }
    
    
    //MARK: - 创建bundle对象
    //要对bundle包解包拿到数据 那么我们需要创建bundle对象 根据路径创建对象
    private lazy var emoticonBundle: NSBundle = {
        
       //获取Emoticons.bundle的路径
        let path = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!
        
        
        //创建bundle对象
        let bundle = NSBundle(path: path)!
        
        return bundle
        
    }()
    
    //MARK: - 根据路径读取表情数据
    
    private lazy var defaultEmoticonArr: [LWEmoticon] = {
        
       return self.loadEmoticonsWithPath("default/info.plist")
        
    }()
    
    
    
    private lazy var emojiEmoticonArray: [LWEmoticon] = {
        
        
       return self.loadEmoticonsWithPath("emoji/info.plist")
        
    }()
    
    
    private lazy var lxhEmoticonArray: [LWEmoticon] = {
        
        return self.loadEmoticonsWithPath("lxh/info.plist")
        
    }()
    
    
    
    //MARK: - 读取表情通用方法,根据子路径
    private func loadEmoticonsWithPath(subPath: String) -> [LWEmoticon] { //根据子路径在plist文件中取出来之后 是一个数组
        
        //获取bundle对象
        let bundle: NSBundle = self.emoticonBundle
        
        //获取Emoticons.bundle中info.plist的文件路径
        let path = bundle.pathForResource(subPath, ofType: nil)!
        
        //打印一下path 
//        print(path)
        
        //获取plist文件中的内容
        let emoticonDicArray = NSArray(contentsOfFile: path)!
        
        //可变数组 存储转换完成的模型
        var tempArr = [LWEmoticon]()
        
        //遍历emoticonDicArray字典数组  实现字典转模型
        for emoticonDic in emoticonDicArray {
            
            //字典转模型
            let emoticon = LWEmoticon(dic: emoticonDic as! [String: AnyObject])
            
            //如果是图片  那么我们需要处理一下路径
            if emoticon.type == "0" {
                
                //将图片路径最后的那个路径移除
                let surplusPath = (path as NSString).stringByDeletingLastPathComponent
                
                //再拼接路径
                emoticon.path = surplusPath + "/" + emoticon.png!
                
                
            }
            
            
            //把模型存入可变数组中
            tempArr.append(emoticon)
            
            
        }
        
        return tempArr
        
        
    }
    
    
    /*
    
    读取表情数据  是一个一维字典数组 (装字典的数组)  取出来之后,我们是需要对这个数组进行处理的  将这个一维字典数组包装成二维数组 因为一页(对应着一个cell)只能显示20个  一维数组中元素的个数要是大于20 那么就不只需要一页了,就需要多页 也即是需要多个cell  所以我们要包装成二维数组 二维数组中的元素是一维数组 二维数组中的元素(一维数组)的个数就对应着有几页 (几个cell)
    
    而这只是将一个表情数据包装成二维数组  这里有三个表情数据  每一个都要包装成二维数组 三个对应的三组 所以我们把三个二维数组放到一个三维数组中,三维数组中元素(即三维数组中的二维数组)的个数就对应着多少个表情数据
    
    */
    
    
    //MARK: - 将某个数据表情拆分成二维数组
    private func pagesWithEmoticons(emoticonArr: [LWEmoticon]) -> [[LWEmoticon]] {
        
        //根据图片的个数计算有多少页(即(每组)有多少个cell) 可以拆分成多少个一维数组
        let pages = (emoticonArr.count - 1) / numbersOfPage + 1
        //可变数组
        var tempArr = [[LWEmoticon]]()
        
        //分成的多个一维数组 依次装入可变数组中 当然我们要计算最后一个一维数组中有多少元素
        for i in 0..<pages {
            
            //获取的索引 表情数据中拆分的每个一维数组的起点,就是拆分出来的一维数组是从哪里开始截取的
            let loc = i * numbersOfPage
            
            //每个一维数组的元素个数 一维数组的长度  除去最后一个一维数组  其他的一维数组都是20个元素
            var len = numbersOfPage
            
            
            //判断最后一个一维数组的个数 如果截取的长度不够20  那么就只取到表情数据中的剩余个数
            //loc 是拆分出来的最后一个一维数组的起点 也是倒数第二个一维数组的终点 如果起点加上长度 大于表情数据数组中元素的个数 那么说明拆分超出了表情数据数组的范围 所以我们只需要取到剩余的个数即可
            if loc + len > emoticonArr.count {
                
                len = emoticonArr.count - loc
                
            }
            
            let subArr = (emoticonArr as NSArray).subarrayWithRange(NSMakeRange(loc, len)) as! [LWEmoticon]
            
            tempArr.append(subArr)
            
        }
        
        return tempArr
        
    }
    
    
    
    
    
    //MARK: - 准备表情视图所需要的数据
    lazy var allEmoticonArr: [[[LWEmoticon]]] = {
        
        return [
        
        self.pagesWithEmoticons(self.defaultEmoticonArr),
        
        self.pagesWithEmoticons(self.emojiEmoticonArray),
            
        self.pagesWithEmoticons(self.lxhEmoticonArray)
        
                ]
        
    }()
    
    
    
    
    //MARK: - 获取相应的模型
    //根据服务端传回来的表情图片对应的字符串 我们要获取到相应的模型
//    func selectEmoticonWithChs(chs: String) -> LWEmoticon? {
//        
////        if let defaultEmoticon = defaultEmoticonArray.
//        
//        
//        
//        
//        
//    }
    
    
    
    
    
    
    

}
